from fastapi import APIRouter
from fastapi.exceptions import HTTPException
from pydantic import BaseModel, field_validator, Field
import datetime
from tortoise.exceptions import DoesNotExist
from app.models.models import *
from utils.utils import (
    get_first_sentence,
    get_two_consecutive_sentence,
    get_first_sentence_list,
    get_sentence_list,
    remove_parentheses,
)

work = APIRouter()


# 用户id校验
class UserIdIn(BaseModel):
    user_id: int = Field(gt=0, lt=1000000)


# 通过用户id获取该用户的作品列表
@work.post("/user/all", summary="获取用户id作品列表")
async def get_user_works(userI: UserIdIn):
    """
    根据用户ID获取其所有作品列表
    
    Parameters:
    - userI (UserIdIn): 包含用户ID的输入模型
    
    Returns:
    - dict: 包含作品列表的字典，以及相关消息和状态码
    """
    # 获取用户ID
    user_id = userI.user_id
    # 根据用户ID查询用户信息
    user = await User.get(id=user_id)
    # 如果用户不存在，则抛出404异常
    if not user:
        raise HTTPException(status_code=404, detail="用户不存在")
    # 获取用户的所有作品列表
    works = await user.works.all().values()
    # 遍历作品列表，对每个作品进行处理
    for work in works:
        # 移除作品内容中的括号
        work["content"] = remove_parentheses(work["content"])
        # 获取作品内容的句子列表
        work["sentences"] = get_sentence_list(work["content"])
        # 获取作品内容的第一句
        work["first_sentence"] = get_first_sentence(work["content"])
    # 返回包含作品列表及相关信息的字典
    return {
        "msg": "ok",
        "data": works,
        "code": 200,
    }


# 作品输入类型校验
class WorkIn(BaseModel):
    name: str = Field(min_length=1, max_length=30)
    content: str = Field(min_length=1, max_length=10000)
    user_id: int = Field(gt=0, lt=1000000)


# 通过用户id和作品输入信息创建作品
@work.post("/create", summary="通过用户id和作品输入信息创建作品")
async def create_work(workI: WorkIn):
    """
    创建一个新作品。
    
    参数:
    - workI: WorkIn类型，包含作品的名称、内容和用户ID。
    
    返回:
    - 成功创建时返回一个包含消息、作品数据和状态码的字典。
    """
    # 从输入中提取作品的名称、内容和用户ID
    name = workI.name
    content = workI.content
    user_id = workI.user_id

    # 获取用户信息
    user = await User.get(id=user_id)
    # 判断用户是否存在
    if not user:
        raise HTTPException(status_code=404, detail="用户不存在")

    # 增加作品
    new_work = await Work.create(
        name=name,
        content=content,
        user=user,
        created_at=datetime.datetime.now(),
    )

    return {
        "msg": "ok",
        "data": new_work,
        "code": 200,
    }


# 用户id和作品id的输入类型校验
class WorkIdIn(BaseModel):
    work_id: int = Field(gt=0, lt=1000000)
    user_id: int = Field(gt=0, lt=1000000)


# 通过用户id和作品id删除作品
@work.delete("/delete", summary="通过用户id和作品id删除作品")
async def delete_work(workI: WorkIdIn):
    """
    异步处理删除作品的请求。

    参数:
    - workI: WorkIdIn类型，包含作品id和用户id。

    返回:
    - 成功删除后返回一个包含'msg'和'code'的字典，表示操作成功。
    - 若作品或用户不存在，抛出404 HTTP异常。
    - 若用户尝试删除非自己创建的作品，抛出403 HTTP异常。
    """
    # 从请求参数中获取作品id和用户id
    work_id = workI.work_id
    user_id = workI.user_id

    try:
        # 获取作品和用户实例
        work = await Work.get(id=work_id)
        user = await User.get(id=user_id)

        # 判断用户是否为作品的创建者
        if work.user_id != user_id:
            raise HTTPException(status_code=403, detail="无权删除他人作品")

        # 删除作品
        await work.delete()

        return {
            "msg": "ok",
            "code": 200,
        }

    except DoesNotExist:
        raise HTTPException(status_code=404, detail="作品或用户不存在")
